package chaoyue.study.io.stream;

import java.io.*;

/**
 * 对象流
 * ObjectInputStream/ObjectOutputStream 是用来做序列化和反序列化的
 * 序列化，反序列化可以用来远程传输对象
 */
public class ObjectStream {
    public static void main(String[] args) throws Exception {
        String filePath = "/Users/chaoyue/Downloads/object";
        write(filePath);
        read(filePath);

    }

    private static void write(String filePath) throws Exception {
        TestObject data1 = new TestObject(1L, "test1");
        TestObject data2 = new TestObject(2L, "test2");
        // 将对象写入到文件(序列化)
        ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream(filePath));
        objectOutputStream.writeObject(data1);
        objectOutputStream.writeObject(data2);
        objectOutputStream.flush();
        objectOutputStream.close();
    }

    private static void read(String filePath) throws Exception {
        // 将对象从文件读取到内存(反序列化)
        ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream(filePath));
        System.out.println(objectInputStream.readObject());
        System.out.println(objectInputStream.readObject());
        objectInputStream.close();
    }


    /**
     * 只有实现了 Serializable 接口的对象才可以被序列化
     * Serializable 接口是一个标志性接口，里面什么方法都没有，就是标志这个是可以被序列化的
     * 这个标志接口是给JVM参考的，JVM看到这个类实现了Serializable接口，会自动生成一个序列化版本号
     * 建议将序列化版本号手动写出来。因为如果类本身的结构发生了改动（比如加了一个字段），JVM自己生成的序列化版本号也会变更
     * 在反序列的时候如果发现与序列化时的版本不一致，会抛出InvalidClassException异常，反序列化失败
     * 但是感觉这个工作用注解来做比较合适？
     */
    private static class TestObject implements Serializable {
        private static final long serialVersionUID = 2;
        private Long id1;
        private String name;
        private String code;


        public TestObject(Long id, String name) {
            this.id1 = id;
            this.name = name;
            this.code = "test";
        }

        @Override
        public String toString() {
            return "TestObject{" +
                    "id=" + id1 +
                    ", name='" + name + '\'' +
                    ", code='" + code + '\'' +
                    '}';
        }
    }

}
